#!/bin/sh

# 函数：添加时间戳到文件名
add_timestamp_to_filename() {
    local filename=$(echo "$1" | tr -cd '[:print:]')  # 去除所有不可打印字符
    local timestamp=$(date +"%Y%m%d_%H%M%S")

    if [[ "$filename" == *.* ]]; then
        local name="${filename%.*}"
        local extension="${filename##*.}"
        echo "${name}_${timestamp}.${extension}"
    else
        echo "${filename}_${timestamp}"
    fi
}

# 函数：从URL中提取文件名
extract_filename_from_url() {
    url="$1"
    
    # 去除查询参数（?后面的内容）
    url_without_query=$(echo "$url" | sed 's/\?.*$//')
    
    # 检查URL是否以/结尾
    if echo "$url_without_query" | grep -q '/$'; then
        echo "index.html"
    else
        # 提取URL最后一个/后的内容
        basename "$url_without_query"
    fi
}

# 函数：从Content-Disposition头中提取文件名
extract_filename_from_header() {
    header="$1"
    
    # 尝试匹配filename="..."格式
    filename=$(echo "$header" | grep -oi 'filename="[^"]*"' | sed 's/filename="//i' | sed 's/"$//')
    
    # 如果上面没找到，尝试匹配filename=...格式
    if [ -z "$filename" ]; then
        filename=$(echo "$header" | grep -oi 'filename=[^;]*' | sed 's/filename=//i')
    fi
    
    # 如果找到了文件名，返回它
    if [ -n "$filename" ]; then
        echo "$filename"
    else
        # 没找到文件名
        echo ""
    fi
}

# 主函数
get_download_filename() {
    url="$1"
    
    if [ -z "$url" ]; then
        echo "错误: 请提供URL" >&2
        return 1
    fi
    
    # 使用curl获取响应头，跟随重定向，但不下载内容
    headers=$(curl -sI -L "$url")
    
    # 获取最后一个响应的Content-Disposition头
    content_disposition=$(echo "$headers" | grep -i "content-disposition:" | tail -1)
    
    if [ -n "$content_disposition" ]; then
        # 从Content-Disposition中提取文件名
        filename=$(extract_filename_from_header "$content_disposition")
        
        if [ -n "$filename" ]; then
            # 添加时间戳到文件名
            add_timestamp_to_filename "$filename"
            return 0
        fi
    fi
    
    # 如果没有Content-Disposition或无法从中提取文件名，从URL中提取
    # 获取最终URL（跟随所有重定向后）
    final_url=$(curl -sIL -o /dev/null -w '%{url_effective}' "$url")
    filename=$(extract_filename_from_url "$final_url")
    
    # 添加时间戳到文件名
    add_timestamp_to_filename "$filename"
}

# 如果直接运行脚本（非作为库导入），处理命令行参数
if [ "$(basename "$0")" = "get_filename.sh" ]; then
    if [ -z "$1" ]; then
        echo "用法: $0 <URL>"
        exit 1
    fi
    
    filename=$(get_download_filename "$1")
    echo "$filename"
fi